ExceptionCatcher.php
<?php
namespace Tlf\Tester;
class ExceptionCatcher {
protected $strict;
protected $targetClass;
protected $contains = [];
public function __construct($expectingClass, $strict=false){
$this->strict = $strict;
$this->targetClass = $expectingClass;
}
public function containing($msg){
$this->contains[] = $msg;
return $this;
}
public function shortenMessage($msg){
$oneLine = implode(" ",array_map('trim',explode("\n",$msg)));
$output = substr($oneLine,0,200);
if (strlen($output)>200)$output .= '...';
return $output;
}
public function matches($exception){
//@TODO improve error output for exception testing. I'd like to report failures with details as well
$strict = $this->strict;
$eClass = get_class($exception);
$eMessage = $exception->getMessage();
if ($strict
&&$eClass!=$this->targetClass)return false;
else if (!($exception instanceof $this->targetClass))return false;
foreach ($this->contains as $str){
if (strpos($eMessage,$str)===false){
return false;
}
}
$output = $this->shortenMessage(var_export($this->contains,true));
$eMessage = $this->shortenMessage(var_export($eMessage,true));
echo "+++pass-exception+++";
if ($strict)echo "\n strict classname comparison";
echo "\nTarget:";
echo "\n- Class: {$this->targetClass}";
echo "\n- Containing: ".$output;
echo "\n--";
echo "\nActual:";
echo "\n- Class: ".$eClass;
echo "\n- Msg: ".$eMessage;
echo "\n------------\n";
return true;
}
}